package gestionReservas;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.text.SimpleDateFormat;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;

@WebService()
public class ReservaTrenes {

//    /**
//     * Web service operation
//     */
    @WebMethod(operationName = "nuevoUsuario")
    public int nuevoUsuario(@WebParam(name = "nombre") String nombre, @WebParam(name = "apellidos") String apellidos, @WebParam(name = "domicilio") String domicilio, @WebParam(name = "localidad") String localidad, @WebParam(name = "provincia") String provincia, @WebParam(name = "pais") String pais, @WebParam(name = "telefono") String telefono, @WebParam(name = "correoe") String correoe, @WebParam(name = "DNI") String DNI, @WebParam(name = "contrasena") String contrasena) {
        try {
            String sDriver = "org.apache.derby.jdbc.ClientDriver";
            String sURL = "jdbc:derby://localhost:1527/BDTrenes";
            Connection con;

            Class.forName(sDriver).newInstance();
            con = DriverManager.getConnection(sURL, "admin", "adminadmin");

            try {
                PreparedStatement stmt = con.prepareStatement("SELECT COUNT(*) FROM USUARIOS WHERE DNI=" + DNI);
                ResultSet resul = stmt.executeQuery();
                resul.next();
                int n = resul.getInt(1);
                if (n != 0) {
                    con.close();
                    return 1;
                }

                stmt = con.prepareStatement("INSERT INTO USUARIOS VALUES (?,?,?,?,?,?,?,?,?,?)");
                stmt.setInt(1, Integer.parseInt(DNI));
                stmt.setString(2, nombre);
                stmt.setString(3, apellidos);
                stmt.setString(4, domicilio);
                stmt.setString(5, localidad);
                stmt.setString(6, provincia);
                stmt.setString(7, pais);
                stmt.setInt(8, Integer.parseInt(telefono));
                stmt.setString(9, correoe);
                stmt.setString(10, contrasena);

                stmt.executeUpdate();
            } catch (java.sql.SQLSyntaxErrorException c) {
                return 2;
            } catch (java.lang.NumberFormatException n) {
                return 2;
            }

        } catch (Exception e) {
            System.out.println(e);
            return 3;
        }
        return 0;
    }
//
//    /**
//     * Web service operation
//     */

    @WebMethod(operationName = "comprobarID")
    public UsuarioClase comprobarID(@WebParam(name = "DNI") String DNI, @WebParam(name = "contrasena") String contrasena) {
        //TODO write your implementation code here:
        UsuarioClase u = new UsuarioClase();
        try {
            String sDriver = "org.apache.derby.jdbc.ClientDriver";
            String sURL = "jdbc:derby://localhost:1527/BDTrenes";
            Connection con;

            Class.forName(sDriver).newInstance();
            con = DriverManager.getConnection(sURL, "admin", "adminadmin");

            PreparedStatement stmt = con.prepareStatement("SELECT * FROM USUARIOS WHERE DNI=" + DNI);
            ResultSet resul = stmt.executeQuery();
            if (resul.next() == false) {
                con.close();
                return null;
            } else {
                if (!resul.getString(10).equals(contrasena)) {
                    con.close();
                    return null;
                }
                u.setDni(resul.getInt(1));
                u.setNombre(resul.getString(2));
                u.setApellidos(resul.getString(3));
                u.setDomicilio(resul.getString(4));
                u.setLocalidad(resul.getString(5));
                u.setProvincia(resul.getString(6));
                u.setPais(resul.getString(7));
                u.setTelefono(resul.getInt(8));
                u.setCorreoe(resul.getString(9));
                u.setContrasena(resul.getString(10));

                con.close();
                return u;
            }
        } catch (Exception e) {
            System.out.println(e);
            return null;
        }
    //return u;
    }

    @WebMethod(operationName = "reservarBillete")
    public int reservarBillete(@WebParam(name = "codTrayecto") int codTrayecto, @WebParam(name = "DNI") int DNI, @WebParam(name = "plazas") int plazas, @WebParam(name = "tarifa") String tarifa) {
        try {
            String sDriver = "org.apache.derby.jdbc.ClientDriver";
            String sURL = "jdbc:derby://localhost:1527/BDTrenes";
            Connection con;

            Class.forName(sDriver).newInstance();
            con = DriverManager.getConnection(sURL, "admin", "adminadmin");

            //Controlar que en el momento que realiza la reserva siguen quedando plazas
            //suficientes
            PreparedStatement stmt = con.prepareStatement("SELECT PLAZASNORMALES,PLAZASWEB,PRECIONORMAL,PRECIOWEB FROM TRAYECTOS WHERE CODTRAYECTO=" + codTrayecto);
            ResultSet resul = stmt.executeQuery();

            resul.next();
            int i;
            float precio;
            String tipoPlaza;
            if (tarifa.equals("normal")) {
                tipoPlaza = new String("PLAZASNORMALES");
                i = resul.getInt(1);
                precio = resul.getFloat(3);
            } else {
                tipoPlaza = new String("PLAZASWEB");
                i = resul.getInt(2);
                precio = resul.getFloat(4);
            }
            if (plazas > i) {
                return -1;  //Retorna -1 si no plazas disponibles
            }
            //Restar n plazas al trayecto para el que esta reservando
            int nPlazas = i - plazas;
            stmt = con.prepareStatement("UPDATE TRAYECTOS SET " + tipoPlaza + "=" + nPlazas + " WHERE CODTRAYECTO=" + codTrayecto);
            stmt.executeUpdate();

            //Crear la nueva reserva
            PreparedStatement consulta = con.prepareStatement("SELECT IDRESERVA FROM RESERVAS ORDER BY IDRESERVA DESC");
            ResultSet clave = consulta.executeQuery();
            int cod = 0;
            if (clave.next() != false) {
                cod = clave.getInt(1) + 1;
            }

            stmt = con.prepareStatement("INSERT INTO RESERVAS VALUES (?,?,?,?,?,?,?,?)");
            stmt.setInt(1, cod);
            stmt.setInt(2, codTrayecto);
            stmt.setInt(3, DNI);
            stmt.setInt(4, plazas);
            stmt.setString(5, "NO PAGADO");
            stmt.setInt(6, (int) precio * plazas);
            java.sql.Date d = new java.sql.Date(System.currentTimeMillis());
            stmt.setDate(7, d);
            stmt.setString(8, tarifa);

            stmt.executeUpdate();

            con.close();

            return cod;

        } catch (Exception e) {
            return -2;
        }

    }
////
////    /**
////     * Web service operation
////     */

    @WebMethod(operationName = "ofertas")
    public java.util.ArrayList<TrayectoClase> ofertas(@WebParam(name = "origen") String origen) {
        //TODO write your implementation code here:

        try {
            String sDriver = "org.apache.derby.jdbc.ClientDriver";
            String sURL = "jdbc:derby://localhost:1527/BDTrenes";
            Connection con;

            Class.forName(sDriver).newInstance();
            con = DriverManager.getConnection(sURL, "admin", "adminadmin");

            PreparedStatement stmt;
            if (origen.equals("Cualquiera")) {
                stmt = con.prepareStatement("SELECT * FROM TRAYECTOS ORDER BY PRECIOWEB,FECHA");
            } else {
                stmt = con.prepareStatement("SELECT * FROM TRAYECTOS WHERE ORIGEN='" + origen + "' ORDER BY PRECIOWEB,FECHA");
            }

            ResultSet resul = stmt.executeQuery();

            java.util.ArrayList<TrayectoClase> trys = new java.util.ArrayList<TrayectoClase>();

            int i = 0;
            while (resul.next() && i < 10) {
                TrayectoClase tc = new TrayectoClase();
                tc.setCodTrayecto(resul.getInt(1));
                tc.setCodTren(resul.getString(2));
                tc.setOrigen(resul.getString(3));
                tc.setDestino(resul.getString(4));
                tc.setPlazasNormales(resul.getInt(5));
                tc.setPlazasWeb(resul.getInt(6));
                tc.setPrecioNormal(resul.getInt(7));
                tc.setPrecioWeb(resul.getInt(8));
                long f1 = resul.getDate(9).getTime();
                java.util.Date d1 = new java.util.Date(f1);
                SimpleDateFormat sd1 = new SimpleDateFormat("EEE dd'/'MM'/'yyyy");
                tc.setFecha(sd1.format(d1));
                tc.setHora(resul.getString(10));
                trys.add(tc);
                i++;
            }
            con.close();
            return trys;
        } catch (Exception e) {
        }

        return null;
    }

    @WebMethod(operationName = "consultaBilletes")
    public java.util.ArrayList<TrayectoClase> consultaBilletes(@WebParam(name = "origen") String origen, @WebParam(name = "destino") String destino, @WebParam(name = "fechaInicio") long fechaInicio, @WebParam(name = "fechaVuelta") long fechaVuelta) {
        //TODO write your implementation code here:
        try {
            String sDriver = "org.apache.derby.jdbc.ClientDriver";
            String sURL = "jdbc:derby://localhost:1527/BDTrenes";
            Connection con;

            Class.forName(sDriver).newInstance();
            con = DriverManager.getConnection(sURL, "admin", "adminadmin");

            PreparedStatement stmt;
            ResultSet resul;
            java.sql.Date date = new java.sql.Date(fechaInicio);

            stmt = con.prepareStatement("SELECT * FROM TRAYECTOS WHERE ORIGEN='" + origen + "' AND DESTINO='" + destino + "' AND FECHA='" + date + "'");
            resul = stmt.executeQuery();

            java.util.ArrayList<TrayectoClase> trays = new java.util.ArrayList<TrayectoClase>();
            while (resul.next()) {
                TrayectoClase t = new TrayectoClase();
                t.setCodTrayecto(resul.getInt(1));
                t.setCodTren(resul.getString(2));
                t.setOrigen(resul.getString(3));
                t.setDestino(resul.getString(4));
                t.setPlazasNormales(resul.getInt(5));
                t.setPlazasWeb(resul.getInt(6));
                t.setPrecioNormal(resul.getFloat(7));
                t.setPrecioWeb(resul.getFloat(8));
                t.setFecha(resul.getString(9));
                t.setHora(resul.getString(10));
                trays.add(t);
            }
            con.close();
            return trays;

        } catch (Exception e) {
        }
        return null;
    }

    /**
     * Web service operation
     */
    @WebMethod(operationName = "consultarReservas")
    public java.util.ArrayList<ReservaClase> consultarReservas(@WebParam(name = "DNI") String DNI, @WebParam(name = "noPagadas") boolean noPagadas) {
        //TODO write your implementation code here:
        try {
            String sDriver = "org.apache.derby.jdbc.ClientDriver";
            String sURL = "jdbc:derby://localhost:1527/BDTrenes";
            Connection con;

            Class.forName(sDriver).newInstance();
            con = DriverManager.getConnection(sURL, "admin", "adminadmin");

            ResultSet resul;
            if (noPagadas == false) {
                PreparedStatement stmt = con.prepareStatement("SELECT r.IDRESERVA, r.CODTRAYECTO, r.NPLAZAS, r.PRECIO, r.ESTADO, r.FECHARESERVA, t.ORIGEN, t.DESTINO, t.FECHA, t.HORA FROM RESERVAS r, TRAYECTOS t WHERE r.CODTRAYECTO=t.CODTRAYECTO AND r.DNI=" + DNI);
                resul = stmt.executeQuery();
            }
            else{
                PreparedStatement stmt=con.prepareStatement("SELECT r.IDRESERVA, r.CODTRAYECTO, r.NPLAZAS, r.PRECIO, r.ESTADO, r.FECHARESERVA, t.ORIGEN, t.DESTINO, t.FECHA, t.HORA FROM RESERVAS r, TRAYECTOS t WHERE r.CODTRAYECTO=t.CODTRAYECTO AND r.DNI=" + DNI+" AND r.ESTADO='NO PAGADO'");
                resul=stmt.executeQuery();
            }

            java.util.ArrayList<ReservaClase> reservas = new java.util.ArrayList<ReservaClase>();

            while (resul.next() != false) {
                ReservaClase rc = new ReservaClase();
                //System.out.println(resul.getString(9));

                rc.setIdReserva(resul.getInt(1));
                rc.setCodTrayecto(resul.getInt(2));
                rc.setNplazas(resul.getInt(3));
                rc.setPrecio(resul.getInt(4));
                rc.setEstado(resul.getString(5));
                long f1 = resul.getDate(6).getTime();
                java.util.Date d1 = new java.util.Date(f1);
                SimpleDateFormat sd1 = new SimpleDateFormat("dd'/'MM'/'yyyy");
                rc.setFechaReserva(sd1.format(d1));
                rc.setOrigen(resul.getString(7));
                rc.setDestino(resul.getString(8));
                f1 = resul.getDate(9).getTime();
                d1 = new java.util.Date(f1);
                rc.setFecha(sd1.format(d1));
                rc.setHora(resul.getString(10));
                reservas.add(rc);
            }

            con.close();
            return reservas;

        } catch (Exception e) {
            System.out.println(e.getMessage());
            return null;
        }
    }

    /**
     * Web service operation
     */
    @WebMethod(operationName = "eliminarReserva")
    public boolean eliminarReserva(@WebParam(name = "idReserva") int idReserva) {

        try {
            String sDriver = "org.apache.derby.jdbc.ClientDriver";
            String sURL = "jdbc:derby://localhost:1527/BDTrenes";
            Connection con;

            Class.forName(sDriver).newInstance();
            con = DriverManager.getConnection(sURL, "admin", "adminadmin");

            PreparedStatement stmt = con.prepareStatement("SELECT NPLAZAS,TARIFA,CODTRAYECTO FROM RESERVAS WHERE IDRESERVA=" + idReserva);
            ResultSet pl = stmt.executeQuery();
            int plazas = 0;
            String tarifa = "normal";
            int codigo = 0;
            if (pl.next()) {
                plazas = pl.getInt(1);
                tarifa = pl.getString(2);
                codigo = pl.getInt(3);
            }

            stmt = con.prepareStatement("DELETE FROM RESERVAS WHERE IDRESERVA=" + idReserva);
            stmt.executeUpdate();

            if (tarifa.equals("normal")) {
                tarifa = "PLAZASNORMALES";
            } else {
                tarifa = "PLAZASWEB";
            }
            stmt = con.prepareStatement("UPDATE TRAYECTOS SET " + tarifa + "=" + tarifa + "+" + plazas + " WHERE CODTRAYECTO=" + codigo);
            stmt.executeUpdate();
            con.close();

        } catch (Exception e) {
            System.out.println(e.getMessage());
            return false;
        }
        return true;
    //TODO write your implementation code here:
    }

    /**
     * Web service operation
     */
    @WebMethod(operationName = "pagarBillete")
    public boolean pagarBillete(@WebParam(name = "nReserva") int nReserva) {
        try {

            String sDriver = "org.apache.derby.jdbc.ClientDriver";
            String sURL = "jdbc:derby://localhost:1527/BDTrenes";
            Connection con;

            Class.forName(sDriver).newInstance();
            con = DriverManager.getConnection(sURL, "admin", "adminadmin");

            PreparedStatement stmt = con.prepareStatement("UPDATE RESERVAS SET ESTADO='PAGADO' WHERE IDRESERVA=" + nReserva);
            stmt.executeUpdate();

            con.close();

        } catch (Exception e) {
            System.out.println(e.getMessage());
            return false;
        }
        //TODO write your implementation code here:
        return true;
    }
        /**
     * Web service operation
     */
    @WebMethod(operationName = "modificarUsuario")
    public boolean modificarUsuario(@WebParam(name = "dni") int dni, @WebParam(name = "nombre") String nombre, @WebParam(name = "apellidos") String apellidos, @WebParam(name = "domicilio") String domicilio, @WebParam(name = "localidad") String localidad, @WebParam(name = "provincia") String provincia, @WebParam(name = "pais") String pais, @WebParam(name = "telefono") int telefono, @WebParam(name = "correoe") String correoe, @WebParam(name = "contrasena") String contrasena) {

        try {
            String sDriver = "org.apache.derby.jdbc.ClientDriver";
            String url = "jdbc:derby://localhost:1527/BDTrenes";

            Class.forName(sDriver).newInstance();
            Connection con = DriverManager.getConnection(url, "admin", "adminadmin");

            PreparedStatement stmt = con.prepareStatement("UPDATE usuarios SET NOMBRE='"+nombre+"', APELLIDOS='"+apellidos+"', DOMICILIO='"+domicilio+"', LOCALIDAD='"+localidad+"', PROVINCIA='"+provincia+"', PAIS='"+pais+"', TELEFONO="+telefono+", CORREOE='"+correoe+"', CONTRASEÑA='"+contrasena+"' WHERE DNI="+dni);
            stmt.executeUpdate();
            con.close();
            return true;
        } catch (Exception e) {
            System.out.println(e.getMessage());
            return false;
        }

    //TODO write your implementation code here:
    }
}
